package br.com.TecnicasOtimizacao.heuristics;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

import br.com.TecnicasOtimizacao.base.PQAProblem;

public class ConstructorGrasp {
	
    protected PQAProblem pqaproblem;
	protected double alfa;
	
	public ConstructorGrasp(double alfa){
		this.alfa = alfa;
	}
	
	public Solution novaSolucao(){
		Object[] valores = new Object[pqaproblem.getDimensao()];
		
		for(int i=0; i < valores.length; i++){
			List<SolutionElement> lrc = construirListaRestritaDeCandidatos(valores);
			int index = pqaproblem.getRandom().nextInt(lrc.size());
            valores[i] = lrc.get(index).getValor();
		}
		
		Solution s = new Solution(pqaproblem);
        s.setValores(valores);;
        return s;
	}
	
//	public List<SolutionElement> construirListaRestritaDeCandidatos(Object[] valores){
//		
//		for(int j=0; j < valores.length ; j++){
//			if(valores[j] != null){
//				valores[j] = ((Integer)valores[j]) - 1;
//			}else{
//				break;
//			}
//		}
//		
//		List<SolutionElement> elementos = new ArrayList<SolutionElement>();
//        int[][] distances = ((TSPProblem)problem).getDataSet().getDistances();
//        
//        List<Integer> valoresInvalidos = new ArrayList<Integer>();
//        for(int i = 0; i < valores.length; i++){
//                if(valores[i] != null){
//                        valoresInvalidos.add((Integer)valores[i]);
//                } else {
//                        break;
//                }
//        }
//        
//        int current;
//        if(valoresInvalidos.size() == 0){
//                current = pqaproblem.getRandom().nextInt(pqaproblem.getDimension());
//        } else {
//                current = valoresInvalidos.get(valoresInvalidos.size() - 1);
//        }
//        
//        if(valoresInvalidos.size() == pqaproblem.getDimension() - 1){
//                valoresInvalidos.remove(((Object)current));
//        }
//        
//        Collections.sort(valoresInvalidos);
//        
//        Integer cmax = null, cmin = null;
//        int kj = 0;
//        int i = current;
//        
//        for(int j = 0; j < distances[i].length; j++){
//                if(valoresInvalidos.size() == 0 || kj >= valoresInvalidos.size() || valoresInvalidos.get(kj) != j){
//                        if(i != j){
//                                if(cmin == null || distances[i][j] < cmin){
//                                        cmin = distances[i][j];
//                                }
//                                if(cmax == null || distances[i][j] > cmax){
//                                        cmax = distances[i][j];
//                                }
//                        }
//                } else {
//                        kj++;
//                }
//        }
//        
//        kj = 0;
//        double threshold = cmin + alfa*(cmax - cmin);
//        for(int j = 0; j < distances[i].length; j++){
//                if(valoresInvalidos.size() == 0 || kj >= valoresInvalidos.size() || valoresInvalidos.get(kj) != j){
//                        if(i != j){
//                                if(distances[i][j] <= threshold){
//                                        elementos.add(new TSPSolutionElement(distances[i][j], i, j));
//                                }
//                        }
//                } else {
//                        kj++;
//                }
//        }
//        
//        for(int k = 0; k < valores.length; k++){
//                if(valores[k] != null){
//                        valores[k] = ((Integer)valores[k]) + 1;
//                } else { 
//                        break;
//                }
//        }
//        
//        for(SolutionElement t : elementos){
//                t.setValor(((Integer)t.getValor()) + 1);
//        }
//        
////      if(elements.size() == 0){
////              System.out.println("OPA!");
////      }
//        
//        return elementos;
//	}

}
